home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / wdj0797.zip / ZOLMAN.ZIP / MAINFRM.CPP < prev    next >
C/C++ Source or Header  |  1996-11-18  |  6KB  |  229 lines

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "MySplitter.h"
  6.  
  7. #include "MainFrm.h"
  8. #include "TopView.h"
  9. #include "TopFrame.h"
  10. #include "BottomView.h"
  11. #include "BottomFrame.h"
  12.  
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18.  
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CMainFrame
  21.  
  22. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  23.  
  24. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  25.     //{{AFX_MSG_MAP(CMainFrame)
  26.     ON_WM_CREATE()
  27.     ON_WM_CLOSE()
  28.     //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30.  
  31. static UINT indicators[] =
  32. {
  33.     ID_SEPARATOR,           // status line indicator
  34.     ID_INDICATOR_CAPS,
  35.     ID_INDICATOR_NUM,
  36.     ID_INDICATOR_SCRL,
  37. };
  38.  
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CMainFrame construction/destruction
  41.  
  42. CMainFrame::CMainFrame()
  43. {
  44.     // TODO: add member initialization code here
  45.     
  46. }
  47.  
  48. CMainFrame::~CMainFrame()
  49. {
  50. }
  51.  
  52. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  53. {
  54.     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  55.         return -1;
  56.     
  57.     if (!m_wndToolBar.Create(this) ||
  58.         !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  59.     {
  60.         TRACE0("Failed to create toolbar\n");
  61.         return -1;      // fail to create
  62.     }
  63.  
  64.     if (!m_wndStatusBar.Create(this) ||
  65.         !m_wndStatusBar.SetIndicators(indicators,
  66.           sizeof(indicators)/sizeof(UINT)))
  67.     {
  68.         TRACE0("Failed to create status bar\n");
  69.         return -1;      // fail to create
  70.     }
  71.  
  72.     // TODO: Remove this if you don't want tool tips or a resizeable toolbar
  73.     m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  74.         CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
  75.  
  76.     // TODO: Delete these three lines if you don't want the toolbar to
  77.     //  be dockable
  78.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  79.     EnableDocking(CBRS_ALIGN_ANY);
  80.     DockControlBar(&m_wndToolBar);
  81.  
  82.     return 0;
  83. }
  84.  
  85. BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
  86.     CCreateContext* pContext)
  87. {
  88. //#$-NOTE:STEP 1-$#
  89.  
  90.     // CREATE A STAIC SPLITTER WINDOW WITH TWO PANES
  91.     if (!m_wndSplitter.CreateStatic(this, 2, 1))
  92.     {
  93.         TRACE("Failed to CreateStaticSplitter\n");
  94.         return FALSE;
  95.     }
  96.     pContext->m_pNewViewClass = RUNTIME_CLASS(CTopView);
  97.     if (!m_wndSplitter.CreateView(0, 
  98.                                   0, 
  99.                                   RUNTIME_CLASS(CTopFrame), 
  100.                                     CSize(100, 250), 
  101.                                     pContext))
  102.     {
  103.         TRACE("Failed to top view\n");
  104.         return FALSE;
  105.     }
  106.  
  107.     pContext->m_pNewViewClass = RUNTIME_CLASS(CBottomView);
  108.        if (!m_wndSplitter.CreateView(1, 
  109.                                      0, 
  110.                                      RUNTIME_CLASS(CBottomFrame), 
  111.                                      CSize(100, 150), 
  112.                                         pContext))
  113.     {
  114.         TRACE("Failed to create bottom view\n");
  115.         return FALSE;
  116.     }       
  117.     return TRUE;
  118. }
  119.  
  120. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  121. {
  122.     // TODO: Modify the Window class or styles here by modifying
  123.     //  the CREATESTRUCT cs
  124.  
  125.     return CFrameWnd::PreCreateWindow(cs);
  126. }
  127.  
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CMainFrame diagnostics
  130.  
  131. #ifdef _DEBUG
  132. void CMainFrame::AssertValid() const
  133. {
  134.     CFrameWnd::AssertValid();
  135. }
  136.  
  137. void CMainFrame::Dump(CDumpContext& dc) const
  138. {
  139.     CFrameWnd::Dump(dc);
  140. }
  141.  
  142. #endif //_DEBUG
  143.  
  144. /////////////////////////////////////////////////////////////////////////////
  145. // CMainFrame message handlers
  146.  
  147. void CMainFrame::OnClose() 
  148. {
  149.     if (m_lpfnCloseProc != NULL && !(*m_lpfnCloseProc)(this))
  150.         return;
  151.  
  152.     // Note: only queries the active document
  153.     CDocument* pDocument = GetActiveDocument();
  154.     if (pDocument != NULL && !pDocument->CanCloseFrame(this))
  155.     {
  156.         // document can't close right now -- don't close it
  157.         return;
  158.     }
  159.     CWinApp* pApp = AfxGetApp();
  160.     if (pApp->m_pMainWnd == this)
  161.     {
  162.         // attempt to save all documents
  163.         if (pDocument == NULL && !pApp->SaveAllModified())
  164.             return;     // don't close it
  165.  
  166.         // hide the application's windows before closing all the documents
  167.         pApp->HideApplication();
  168.  
  169.         // close all documents first
  170.         pApp->CloseAllDocuments(FALSE);
  171.  
  172.         // SINCE THERE IS NO VIEW ATTACHED TO THE MAIN FRAME IT DOES NOT GET DESTROYED
  173.         // BY CloseAllDocuments(FALSE), WHICH IS WHAT USUALLY HAPPENS.  SO WE MUST 
  174.         // DESTROY IT HERE
  175.         CWnd * ptMainFrame = AfxGetMainWnd();
  176.         ASSERT(ptMainFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)));
  177.         ptMainFrame->DestroyWindow();
  178.         
  179.  
  180.         // don't exit if there are outstanding component objects
  181.         if (!AfxOleCanExitApp())
  182.         {
  183.             // take user out of control of the app
  184.             AfxOleSetUserCtrl(FALSE);
  185.  
  186.             // don't destroy the main window and close down just yet
  187.             //  (there are outstanding component (OLE) objects)
  188.             return;
  189.         }
  190.         
  191.         // there are cases where destroying the documents may destroy the
  192.         //  main window of the application.
  193.         if (!afxContextIsDLL && pApp->m_pMainWnd == NULL)
  194.         {
  195.             AfxPostQuitMessage(0);
  196.             return;
  197.         }
  198.     }
  199.  
  200.     // detect the case that this is the last frame on the document and
  201.     // shut down with OnCloseDocument instead.
  202.     if (pDocument != NULL && pDocument->m_bAutoDelete)
  203.     {
  204.         BOOL bOtherFrame = FALSE;
  205.         POSITION pos = pDocument->GetFirstViewPosition();
  206.         while (pos != NULL)
  207.         {
  208.             CView* pView = pDocument->GetNextView(pos);
  209.             ASSERT_VALID(pView);
  210.             if (pView->GetParentFrame() != this)
  211.             {
  212.                 bOtherFrame = TRUE;
  213.                 break;
  214.             }
  215.         }
  216.         if (!bOtherFrame)
  217.         {
  218.             pDocument->OnCloseDocument();
  219.             return;
  220.         }
  221.  
  222.         // allow the document to cleanup before the window is destroyed
  223.         pDocument->PreCloseFrame(this);
  224.     }
  225.  
  226.     // then destroy the window
  227.     DestroyWindow();
  228. }
  229.